11546
18342
java.nio.ByteBuffer a를 (새로 생성 된) CharBuffer b 또는 char [] b로 변환하는 가장 빠른 방법은 무엇입니까?
이렇게함으로써 a [i] == b [i]가 중요합니다. 즉, a [i]와 a [i + 1]이 함께 값 b [j]를 구성하지 않고 getChar (i)가 수행하는 작업이지만 값은 "확산"되어야합니다.
byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // 각각 바이트 (서명 됨)
char b [] = {1,2,3, 125,126,127, 128, 129, 130} // 각각 문자 (부호 없음)
byte : -128은 char : 128과 동일한 (하위 8) 비트를가집니다. 따라서 비트가 동일하기 때문에 위에서 언급 한대로 "최상의"해석이 될 것이라고 가정합니다.
그 후에는 그 반대의 번역도 필요합니다. char [] 또는 java.nio.CharBuffer를 java.nio.ByteBuffer로 다시 가져 오는 가장 효율적인 방법입니다. 
따라서 원하는 것은 인코딩 ISO-8859-1을 사용하여 변환하는 것입니다.
나는 효율성에 대해 아무것도 주장하지 않지만 적어도 작성하는 것은 아주 짧습니다.
CharBuffer 결과 = Charset.forName ( "ISO-8859-1"). decode (byteBuffer);
다른 방향은 다음과 같습니다.
ByteBuffer 결과 = Charset.forName ( "ISO-8859-1"). encode (charBuffer);
이를 다른 솔루션과 비교하여 측정하십시오. (공정하게 말하면 Charset.forName 부분은 포함되어서는 안되며 각 버퍼에 대해 다시 수행되지 않고 한 번만 수행해야합니다.)
Java 7에는 사전 인스턴스화 된 Charset 인스턴스가있는 StandardCharsets 클래스도 있으므로 다음을 사용할 수 있습니다.
CharBuffer 결과 = StandardCharsets.ISO_8859_1.decode (byteBuffer);
과
ByteBuffer 결과 = StandardCharsets.ISO_8859_1.encode (charBuffer);
대신. (이 행은 이전 행과 동일하며 조회가 더 쉽고 이름을 잘못 입력 할 위험이 없으며 불가능한 예외를 포착 할 필요가 없습니다.)
|
나는 @Ishtar에 동의하고, 새로운 구조로의 변환을 전혀 피하고 필요할 때만 변환 할 것을 제안합니다.
그러나 힙 ByteBuffer가 있으면 할 수 있습니다.
ByteBuffer bb = ...
바이트 [] 배열 = bb.array ();
char [] chars = 새 char [bb.remaining ()];
for (int i = 0; i